﻿<?php
class zen_analizador_cartucho {
	/**
	* La ventana principal asociada al analizador
	* @var zen_ventana_principal
	*/
	var $ventana;
	/**
	 * Ruta del cartucho actual
	 *
	 * @var str
	 */
	var $ruta = "";
	/**
	* Constructor
	* @param zen_ventana_principal
	* @return zen_analizador_cartucho
	*/
	function zen_analizador_cartucho(&$ventana_principal){
		$this->ventana =& $ventana_principal;
	}

	/**
  	* Recorre $nodos construyendo cada uno de sus items
  	* @param object $nodos
  	*/
	function leer_nodos_cartucho(&$nodos) {
		foreach ($nodos as $nodo) {
			print_r($nodo);
			if ($nodo->nodeType != 1)
			continue;
			$ret = $this->construirItems($nodo);
			if (!$ret) return false; //Ha ocurrido algún fallo
		}
		
		return true; //En caso contrario, todo OK
	}
	/**
	 * Construye el modelo de configuración para generar las aplicaciones
	 *
	 * @param domnode $nodo
	 * @param str $tipo
	 * @return bool
	 */
	function construirItems(&$nodo, $tipo = null) {
		if (!$tipo)
		$tipo = $nodo->nodeName;
		$id = $nodo->getAttribute("id");
		/*if ($tipo != "" && is_null($id)) {
			throw new Exception("Item sin id");
			return false;
		}*/
		switch ($tipo) {
			default:
				echo $tipo;
				break;
			case 'previsualizacion':
				$this->ventana->poner_imagen(str_replace(basename($this->ruta),"",$this->ruta).$nodo->nodeValue);
				break;
		}
		return true; //Todo se construyó sin error...
	}
	
	/**
	 * Lee una imagen del fichero XML dado por $ruta del nodo <previsualizacion>ruta.jpg</previsualizacion> O <previsualizacion>ruta.gif</previsualizacion>
	 * y carga dicha imagen en un objeto GdkPixbuf pasado por referencia como $pb devolviendo el resultado
	 * @param str $ruta
	 * @param GdkPixbuf $pb
	 * @return bool
	 */
	function lee_previsualizacion_del_cartucho($ruta,&$pb){
		echo "Leyendo $ruta \n";
		$this->ruta = $ruta;
		if (!is_readable($ruta)) return false;
		$lector = DOMDocument::load($ruta);
		if (!$lector || !$lector->validate()) die("No se puede leer el XML"); // return false;
		$imagen = "";
		$nodos  = $lector->documentElement->childNodes;
		foreach ($nodos as $nodo) {
			if ($nodo->nodeType != 1) continue; //restricción del tipo de nodo
			$tipo = $nodo->nodeName;
			if (strtolower($tipo)=='previsualizacion') {//Bingo!
				$imagen = str_replace(basename($ruta),"",$ruta).$nodo->nodeValue;
				//Intentar leer la imagen
				if (!is_readable($imagen)){
					//throw new Exception("No se puede leer la imagen de previsualización del cartucho: ".$imagen);
					trigger_error("No se puede leer la imagen de previsualización del cartucho: ".$imagen,E_USER_WARNING);
					return false;
				} else {
					//Hay una imagen:
					@$pb = GdkPixbuf::new_from_file($imagen)->scale_simple(32, 32, Gdk::INTERP_BILINEAR);
					return true;
				}
			}
		}
		return true; //En caso contrario, todo OK
	}
		/**
    * Procesa la carga del cartucho
    * @TODO: Terminar la función con el ejemplo del PORTAL, añadir una captura ,etc.
    */
	function cargar_cartucho($ruta){
		$this->ruta = $ruta;
		//$this->img->set_from_file($ruta);
		if (!is_readable($ruta)) return false;
		//lector XML: que lee la configuración del fichero y pone la imagen de preview,etc.
		$lector = DOMDocument::load($ruta);
		if ($this->inicio_carga_cartucho($lector)){
		 $this->cartucho_actual = $ruta; //Todo ok
		 
		}
	}
	/**
	 * Valida el objeto DOMXML y llama a la función recursiva que itera todos los nodos del 
	 * fichero para ir leyendo las definiciones del cartucho base para generar la aplicación.
	 * @param DOMDocument $xml 
	 */
	private function inicio_carga_cartucho(&$xml){
		if ($xml->validate()){
			$nodos = $xml->documentElement->childNodes;
			//Comprobar el fichero:
			return ($this->leer_nodos_cartucho($nodos));
		} else {
			throw new Exception("La validación del XML ha fallado");
		}
	}
}
?>